package com.sky.proxy.jdkDynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;

/**
 *
 * date : 2025年5月9日
 * @author : wushikai
 */
public class MybatisProxyGenerator implements InvocationHandler {

    private Object target;

    public MybatisProxyGenerator(Object target) {
        this.target = target;
    }

    /**
     * mybatis 的玩法 ; 我这里注册一个 方法,  直接根据字符串来进行映射;
     */
    private static HashMap<String, Method> methodMapper = new HashMap<>();


    static {
        try {

            //我这里甚至可以使用  class.forName ( 字符串参数 ) 来替换;  我们都知道框架就是字符串配置;
            methodMapper.put(NetSinger.class.getMethod("sing", String.class).getName(), NetSinger.class.getMethod("sing", String.class));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

    }




    /**
     * Proxy.newProxyInstance(
     *                 Thread.currentThread().getContextClassLoader(),
     *                 new Class[]{IStar.class},
     *                 new  CommonProxyGenerator(  new Singer("许嵩")  )
     *                 );
     * @param method   传入的是 你 IStar  的方法;
     * */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (proxy != null) {
            System.out.println("我是通用的代理人, 我现在为 " + target.toString() + "干活");
        }
        System.out.println(" 卖票 ");
        methodMapper.get(method.getName()).invoke(target, args);  //mybatis 的玩法,  mybatis的那些接口统统没有实现类的;  映射给 methodProxy 去调用 mybatis内部的方法;
        System.out.println(" 分账  ");
        return proxy;
    }
}
